package DriverTexto;
import java.util.Vector;

    /**Autor: Pedro Redondo Quesada **46471772R**/
public class Texto {
    final private String[] FNC= {"a","al","ante","bajo","cabe","con","contra","de","del","desde",
    "en","entre","hacia","hasta","para","por","segun","sin","so","sobre","tras","el","los","la","las","don",
    "doña","este","esta","esto","ese","esa","eso","aquel","aquella","aquello","mio","mia","tuyo","tuya",
    "suyo","suya","nuestro","nuestra","vuestro","vuestra","mi","tu","su","nos","vos","yo","tu","ella",
    "nosotros","vosotros","ellos","usted","ustedes","me","te","se","mucho","mucha","muchos","muchas",
    "poco","poca","pocos","pocas","algun","alguna","alguno","algo","alguien","todo","toda","todos",
    "todas", "nada","nadie","bastante","bastantes","demasiado","demasiada","demasiados","demasiadas",
    "suficiente","suficientes","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve","diez",
    "once","doce","trece","catorce","quince","dieciseis","diecisiete","dieciocho","diecinueve","veinte",
    "cien", "cientos","centenar", "mil","miles","millar","millon","millones","primero","segundo","tercero",
    "cuarto","quinto","sexto","septimo","octavo","noveno","decimo","primera","segunda","tercera",
    "cuarta","quinta","sexta","septima","octava","novena","decima","y","e","ni","o","u","mas","menos",
    "pero","le","lo"};
    
    private String texto;
    private int indice;
    //private Vector<String> listadopalabras;

//Constructoras
    
    public Texto(){
    //{Pre: cierto}
    //{Post: genera un texto vacío}
    texto="";
    indice=0;
    //this.listadopalabras=new Vector(0,1);
    }

    public Texto(String txt){
    //{Pre: pth es un path válido}
    //{Post: lee el String txt y genera un Texto}
        if (!txt.equals("") && !txt.equals(" ")){
            this.texto=" "+txt;
            this.indice=0;
            //this.listadopalabras=new Vector(0,1);
            System.out.println("Texto inicial:\n" + this.texto);
            this.subsNoFuncional();
            System.out.println("Substituidas las no funcionales:\n" + this.texto);
            this.tknFuncional();
            System.out.println("Texto Final:\n" + this.texto);
               
        }        
     }
    
//Consultoras
    private void isBiword(){
    //{Pre: cierto}
    //{Post:devuelve cierto si el String es una concatenación válida de palabras
    // y modifica la posicion de indice al final de la secuancia de Biword}
        boolean b=true;
        String aux="";
        String fin="";
        int i=this.indice;
        int contpal=0;
        while(i<this.texto.length() && b){
            if (this.texto.charAt(i)>='A' && this.texto.charAt(i)<='Z'){
                for(;i<this.texto.length() && i<this.texto.length() && this.texto.charAt(i)!=' ' && this.texto.charAt(i)!='\n';i++)
                    {aux=aux+this.texto.charAt(i);}
                contpal++;
                fin=aux;
                if(i<this.texto.length() && this.texto.charAt(i)==' ')                    
                    for(;i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x');i++){aux=aux+this.texto.charAt(i);}
                else    b=false; // hemos encontrado /n
                }
            else    b=false; // hemos encontado palabra en min
        }
        if (contpal>1){
            this.indice=i;
            System.out.println(fin);
        }             
     }

//Modificadoras

    private void subsNoFuncional(){
    //{Pre: cierto}j
    //{Post sustituye del texto las palabras funcionales por x y elimina los signos de puntuacion y acentos}
        int i;
        String actual="";
        String[] spunt={"...",".",",",":",";","¡","!"};
        //for(int j=0; j<spunt.length;j++){
          //  this.texto=this.texto.replaceAll(spunt[j]," ");
        //}
        for(i=0;i<this.texto.length();i++){
            if(this.texto.charAt(i)==' ' || this.texto.charAt(i)=='\n'){
                if(this.esFuncional(actual)==true){
                    this.texto=this.texto.replaceFirst(" "+actual+" "," x ");
                    i=i-(actual.length()+1);
                }
                actual="";
            }
                else    actual=actual+this.texto.charAt(i);
        }         
    }
    
    private boolean esFuncional(String p){
        boolean b=false;
        p=p.toLowerCase();
        for(int i=0; i<this.FNC.length && !b;i++)
            if(p.equals(this.FNC[i]))
                b=true;
        return b;
    }

    private void tknFuncional(){
    //{Pre: el parametro implicito no contiene palabras funcionales}
    //{Post: convierte palabras funcinales en su raíz}
        char[] txt=this.texto.toCharArray();
        int index;
        System.out.println("Listado biwords:");
        for(this.indice=0;this.indice<this.texto.length();this.indice++){
            this.isBiword();
         }
        this.texto=this.texto.toLowerCase();
        System.out.println("\nListado total de palabras:");
        int i=0;
        while(i<this.texto.length()){
            String aux="";
            for(;i<this.texto.length() && this.texto.charAt(i)!=' ' && this.texto.charAt(i)!='\n' && this.texto.charAt(i)!='x';i++)
                    {aux=aux+this.texto.charAt(i);}
            if(!aux.equals(""))
                    System.out.print(aux + "\n");
            if(i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x'))
                    for(;i<this.texto.length() && (this.texto.charAt(i)==' ' || this.texto.charAt(i)=='x');i++){}                        
             
        }
    }
  
 }